package com.bjpowernode.edynamicproxy;

import com.bjpowernode.dstaticproxy.Girl;
import com.bjpowernode.dstaticproxy.XiaoHong;
import com.bjpowernode.dstaticproxy.You;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/*
    动态代理
    jdk提供的动态代理只能创建接口的代理
 */
public class Test02 {
    public static void main(String[] args) {
        //创建目标对象
        Girl xiaoHong = new XiaoHong();

        //通过jdk创建代理对象

        //使用lambda创建InvocationHandler对象
        /*
            参数1：代理对象的自身引用
            参数2：当前被调用的方法
            参数3：被调用方法的参数
         */
        InvocationHandler handler = (Object proxy, Method method, Object[] arguments) ->{
            System.out.println("准备");
            Object invoke = null;
            //判断当前调用的方法是不是接收礼物的方法
            if ("receiveGift".equalsIgnoreCase(method.getName())){
                invoke = method.invoke(xiaoHong, new Object[]{(Integer) arguments[0] / 2});
            }else {
                invoke = method.invoke(xiaoHong);
            }
            System.out.println("事务提交");
            System.out.println("结果");

            return invoke;
        };

                /*
            参数1：目标对象的类加载器
            参数2：目标对象的父接口
            参数3：InvocationHandler对象
         */
        Girl proxy = (Girl) Proxy.newProxyInstance(xiaoHong.getClass().getClassLoader(),
                xiaoHong.getClass().getInterfaces(), handler);


        //创建自己的对象
        You you = new You(proxy);
        you.makeFriend();
        you.sendGift(10);

    }
}
